package com.ruoyi.security.service.backtest.gridtrading.charge;

import com.ruoyi.security.enums.SecurityTradeTypeEnum;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * 股票交易手续费计算服务
 * 股票交易手续费 = 券商佣金 + 印花税 + 规费
 * 券商佣金：双向，约万分之2.5至万分之3，可协商，最低5元
 * 印花税：单向，卖出成交金额的万分之5，0.0005
 * 规费：双向 0.0003341
 *      经手费：双向，0.0000341 沪深 0.000125 北交所
 *      过户费：双向，0.0001
 *      征管费：双向，0.0002
 * 
 * @author yeoman
 * @date 2025/2/4
 */
@Service
public class SecurityTradeChargeService {
    
    /**
     * 股票印花税率（0.0005百分之0.05）
     */
    private static final BigDecimal STAMP_TAX_RATE = new BigDecimal("0.0005");
    
    /**
     * 计算股票交易手续费
     * @param type 交易类型 @see SecurityTradeTypeEnum
     * @param amount 金额
     * @param commissionTenThousandth 券商佣金万分之（默认万2.5元）
     * @param minimumCommission 最低佣金（默认5元）
     * @return 手续费
     */
    public BigDecimal calculateCharge(String type, BigDecimal amount, BigDecimal commissionTenThousandth, BigDecimal minimumCommission) {
        BigDecimal charge = BigDecimal.ZERO;
        
        // 券商佣金
        BigDecimal brokerCharge = amount.multiply(commissionTenThousandth.divide(new BigDecimal("10000"), 6, RoundingMode.HALF_UP)).setScale(2, RoundingMode.HALF_UP);
        if (brokerCharge.compareTo(minimumCommission) < 0) {
            brokerCharge = minimumCommission;
        }
        charge = charge.add(brokerCharge);
        
        // 印花税（仅卖出时收取）
        if (SecurityTradeTypeEnum.SELL.getKey().equals(type)) {
            BigDecimal stampTaxCharge = amount.multiply(STAMP_TAX_RATE).setScale(2, RoundingMode.HALF_UP);
            charge = charge.add(stampTaxCharge);
        }
        
        // 规费（暂不计算）
        // BigDecimal regulatoryCharge = amount.multiply(new BigDecimal("0.0003341"));
        // charge = charge.add(regulatoryCharge);
        
        return charge;
    }
}

